/*
注意到糖果总是尽量少给，且从1开始累计，每次要么比相邻的同学多给一个，要么重新置为1

记前一个同学分得的糖果数量为 pre

    1.如果当前同学比上一个同学评分高，说明我们就在最近的递增序列中，直接分配给该同学 pre+1个糖果即可
    2.否则我们就在一个递减序列中，我们直接分配给当前同学一个糖果，并把该同学所在的递减序列中所有的同学都再多分配一个糖果，以保证糖果数量还是满足条件。
        2-1.我们无需显式地额外分配糖果，只需要记录当前的递减序列长度，即可知道需要额外分配的糖果数量。
        2-2.同时注意当当前的递减序列长度和上一个递增序列等长时，需要把最近的递增序列的最后一个同学也并进递减序列中。

 */
var candy = function(ratings) {
    const n = ratings.length;
    let ret = 1;
    // inc 递增序列长度 dec 递减序列长度 pre 前一个学生糖果数量
    let inc = 1, dec = 0, pre = 1;

    for (let i = 1; i < n; i++) {
        // 递增时
        if (ratings[i] >= ratings[i - 1]) {
            // 递减序列为0
            dec = 0;
            // 如果两个元素相同 则置当前元素为1 否则当前元素为pre+1
            if (ratings[i] === ratings[i - 1]) pre = 1;
            else pre++;
            // 记录总和
            ret += pre;
            // 递增序列末尾(长度)
            inc = pre;
        } else {
            // 递减序列开始了
            dec++;
            // 针对【1，3，5，3，2，2】和【1，3，5，3，2，1】，前者是升3级降3级，后者是升3级降4级，按照程序的设计，当inc和dec相等时，例如inc=3，dec=3时，说明降序有4级，需要保证满足4级结构，需要+1来提高一级。
            if (dec === inc) {
                dec++;
            }
            // 只需要记录当前的递减序列长度，即可知道需要额外分配的糖果数量。
            ret += dec;
            // 递减时一直保持pre === 1 因为这个只有递增时使用 当从递减到递增时，这个数一定为1
            pre = 1;
        }
    }
    return ret;
};
